package com.hivision.aladdin.codec;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class ReportProcess {
    private String identifier; // 设备在应用协议里的标识

    private String msgType; // 固定值"deviceReq"，表示设备上报数据
    /**
     * 表示设备是否还有后续消息，0表示没有，1表示有，平台暂时不下发缓存命令，直到为0，下发缓存命令，不带按照0处理。
	 * 注：后续消息是指，设备上报的某条数据可能分成多次数据上报，在本次上报数据后，以hasMore字段判定后续是否还有消息。
	 * 请谨慎处理该字段，如果是必须数据上报后才有缓存命令下发的场景，只有某次数据上报时hasMore为0，缓存命令才能下发。
     */
    private int hasMore = 0;  
    private int errcode = 0;

    private int mid = 0;
    private String uid;
    
    private int cmdCode; // 指令码
    private final int CMDCODE_INDEX = 16; // 指令码字节的位置索引
    private int alarmType; // 报警类型

    /**
     * @param binaryData 设备发送给平台coap报文的payload部分
     * 
      * @return
     */
    public ReportProcess(byte[] binaryData) {
    	try {
    		this.identifier = Utilty.getInstance().parseByte2AscStr(binaryData, 6, 8);
        	
        	// 指令码
        	this.cmdCode = Utilty.getInstance().bytes2Int(binaryData, CMDCODE_INDEX, 2);
            // 消息id
            this.mid = Utilty.getInstance().bytes2Int(binaryData, CMDCODE_INDEX-2, 2);
            //uid
            this.uid = Utilty.getInstance().parseByte2AscStr(binaryData, 6, 8);
            
    		msgType = "deviceReq";
    		hasMore = 0;
    		
    		if(cmdCode == 0x0002 ){ // 报警上传
        		//数据部分
        		alarmType = Utilty.getInstance().bytes2Int(binaryData, 18, 2);
        	}
    		
		} catch (Exception e) {
			e.printStackTrace();
		}
    }

    public ObjectNode toJsonNode() {
        try {
            //组装body体
            ObjectMapper mapper = new ObjectMapper();
            ObjectNode root = mapper.createObjectNode();

            root.put("identifier", this.identifier);
            root.put("msgType", this.msgType);
            root.put("hasMore", this.hasMore);
            
            //根据msgType字段组装消息体(设备主动上报数据)
            if (("deviceReq").equals(this.msgType)) {
        		ArrayNode arrynode = mapper.createArrayNode();
                
                ObjectNode node = mapper.createObjectNode();
                node.put("serviceId", "SmokeDetectorBasic");
                ObjectNode nodeData = mapper.createObjectNode();
                nodeData.put("cmdCode", this.cmdCode);
                nodeData.put("uid", this.uid);
                nodeData.put("mid", this.mid);
                
                if(cmdCode == 0x0002 ){ // 报警上传
            		//数据部分
                	nodeData.put("alarmType", this.alarmType);
            	}
                
                node.put("serviceData", nodeData);
                arrynode.add(node);
                
                root.put("data", arrynode);
            } else{
				System.out.println(String.format("error cmdCode [%s] can not found in ReportProcess", this.cmdCode));
				throw new Exception(String.format("error cmdCode [%s] can not found in ReportProcess", this.cmdCode));
            }
            return root;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}